package com.ltxtiyu.video.tool;

import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Base64Utils;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class ImageTool {

    /**
     * 下载网络图片
     * @param imageUrl
     * @param imageName
     * @return
     * @throws Exception
     */
    public static File saveImage(String imageUrl, String imageName) throws Exception {
        //new一个URL对象
        URL url = new URL(imageUrl);
        //打开链接
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        //设置请求方式为"GET"
        conn.setRequestMethod("GET");
        //超时响应时间为5秒
        conn.setConnectTimeout(5 * 1000);
        //通过输入流获取图片数据
        InputStream inStream = conn.getInputStream();
        //得到图片的二进制数据，以二进制封装得到数据，具有通用性
        byte[] data = readInputStream(inStream);
        //new一个文件对象用来保存图片，默认保存当前工程根目录
        File imageFile = new File("J:\\ideaWorkspace\\helloSpring\\hello\\src\\main\\webapp\\WEB-INF\\file\\"+imageName + ".jpg");
        //创建输出流
        FileOutputStream outStream = new FileOutputStream(imageFile);
        //写入数据
        outStream.write(data);
        //关闭输出流
        outStream.close();

        return imageFile;
    }

    /**
     * 叠加图片 - 文件
     * @param file
     * @param waterFile
     * @param x
     * @param y
     * @param alpha
     * @return
     * @throws IOException
     */
    public static BufferedImage overlayImageFile(File file, File waterFile, int x, int y, float times, float alpha) throws IOException {
           // 获取底图
           BufferedImage buffImg = ImageIO.read(file);
           // 获取层图
           BufferedImage waterImg = ImageIO.read(waterFile);

           // 创建Graphics2D对象，用在底图对象上绘图
           Graphics2D g2d = buffImg.createGraphics();
           int waterImgWidth = (int)(waterImg.getWidth() * times);// 获取层图的宽度   // 缩放倍数
           int waterImgHeight = (int)(waterImg.getHeight() * times);// 获取层图的高度 // 缩放倍数
           // 在图形和图像中实现混合和透明效果
//           g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
           // 绘制
           g2d.drawImage(waterImg, x, y, waterImgWidth, waterImgHeight, null);
           g2d.dispose();// 释放图形上下文使用的系统资源
           return buffImg;
     }

    /**
     * 叠加图片 - 流
     * @param bottomImg
     * @param topImg
     * @param x
     * @param y
     * @param alpha
     * @return
     * @throws IOException
     */
    public static BufferedImage overlayImageStream(BufferedImage bottomImg, BufferedImage topImg, int x, int y, float times, float alpha) throws IOException {
        // 创建Graphics2D对象，用在底图对象上绘图
        Graphics2D g2d = bottomImg.createGraphics();
        int waterImgWidth = (int)(topImg.getWidth() * times);// 获取层图的宽度   // 缩放倍数
        int waterImgHeight = (int)(topImg.getHeight() * times);// 获取层图的高度 // 缩放倍数
        // 在图形和图像中实现混合和透明效果  0-1
//           g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
        // 绘制
        g2d.drawImage(topImg, x, y, waterImgWidth, waterImgHeight, null);
        g2d.dispose();// 释放图形上下文使用的系统资源
        return bottomImg;
    }

    public static byte[] readInputStream(InputStream inStream) throws Exception {
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        //创建一个Buffer字符串
        byte[] buffer = new byte[1024];
        //每次读取的字符串长度，如果为-1，代表全部读取完毕
        int len = 0;
        //使用一个输入流从buffer里把数据读取出来
        while( (len=inStream.read(buffer)) != -1 ){
            //用输出流往buffer里写入数据，中间参数代表从哪个位置开始读，len代表读取的长度
            outStream.write(buffer, 0, len);
        }
        //关闭输入流
        inStream.close();
        //把outStream里的数据写入内存
        return outStream.toByteArray();
    }

    /**
     * 将url图片转换为base64
     */
    public static String imageUrlToBase64(String imageUrl) throws Exception {
        if(StringUtils.isBlank(imageUrl)){
            return null;
        }
        URL url = new URL(imageUrl);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        // 设置请求方式为GET  
        connection.setRequestMethod("GET");
        // 设置超时响应时间为5秒  
        connection.setConnectTimeout(5000);
        connection.setReadTimeout(5000);
        // 通过输入流获取图片数据  
        InputStream inStream = connection.getInputStream();
        byte[] bytes = readInputStream(inStream);
        String result = Base64Utils.encodeToString(bytes);
        return result;
    }

    public static void main(String[] args) throws Exception {
        System.out.println(imageUrlToBase64("http://thirdwx.qlogo.cn/mmopen/vi_32/jLa8xUMlwC3hiaF2Q8bhEZJB2uD26sPAQONibaZSvCOYyxgFcoYShKD9pqBqK7rE4TBMia2k9CogRQw8YFOSFcCDQ/132"));
    }
}
